package com.atguigu.gmall.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.hbase.client.Connection;
import redis.clients.jedis.Jedis;

/**
 * @Author lzc
 * @Date 2023/6/4 18:36
 */
public class DimUtilHbase {
    /**
     * 读取维度数据
     * @param redisClient redis 客户端
     * @param conn hbase 连接
     * @param nameSpace hbase 的命名空间
     * @param tableName hbase 中的表名
     * @param id 要查询的维度数据的 id
     * @return 查询到的维度数据.如果是 null 表示没有查找到
     */
    public static JSONObject readDim(Jedis redisClient,
                                     Connection conn,
                                     String nameSpace,
                                     String tableName,
                                     String id) {
        // 1. 先从 redis 读取维度数据
        JSONObject dim = readDimFromRedis(redisClient, tableName, id);
        if (dim == null) {
            // 2. 缓存中没有读取到维度数据, 从 HBase数据库中读取维度数据
            dim = readDimFromHBase(conn, nameSpace, tableName, id);
            // 3. 把维度数据写到缓存
            writeDimToRedis(redisClient, tableName, id, dim);
        }
        return dim;
        
    }
    
    /**
     * 从 hbase 查找维度数据
     * @param conn hbase 连接
     * @param nameSpace hbase 命名空间
     * @param tableName hbase 表名
     * @param rowKey hbase 表数据的 rowKey
     * @return 查询到维度数据,所有列封装到一个 JSONObject 中
     */
    public static JSONObject readDimFromHBase(Connection conn,
                                              String nameSpace,
                                              String tableName,
                                              String rowKey) {
        return HbaseUtil.readDim(conn, nameSpace, tableName, rowKey);
    }
    
    /**
     * 从 redis 缓存中读取维度数据
     * @param redisClient redis客户端
     * @param tableName 维度数据的表名
     * @param id 要查询的维度的 id
     * @return 查询到的维度数据.如果没有查到返回 null
     */
    public static JSONObject readDimFromRedis(Jedis redisClient,
                                              String tableName,
                                              String id) {
        // string
        String key = getKey(tableName, id);
        String json = redisClient.get(key);
        if (json != null) {
            return JSON.parseObject(json);
        }
        return null;
    }
    
    /**
     * 把维度数据写入到缓存中
     * @param redisClient redis客户端
     * @param tableName 维度数据的表名
     * @param id 维度的 id
     * @param dim 要写入的维度数据
     */
    public static void writeDimToRedis(Jedis redisClient,
                                       String tableName,
                                       String id,
                                       JSONObject dim) {
        String key = getKey(tableName, id);
        redisClient.setex(key, 2 * 24 * 60 * 60, dim.toJSONString());
    }
    
    /**
     * 根据维度表名和 id 获取一个 redis 中的 key
     * @param tableName 维度表名
     * @param id 维度 id
     * @return 要写入到 HBase 中的 key
     */
    public static String getKey(String tableName, String id) {
        return tableName + ":" + id;
    }
}
